package com.ttbj.product.api;

import java.io.IOException;
import java.util.ArrayList;
import java.util.HashMap;
import java.util.List;
import java.util.Map;
import java.util.stream.Collectors;

import org.apache.poi.hssf.record.PageBreakRecord.Break;
import org.springframework.util.StringUtils;

import com.ttbj.constant.CompanyLoaction;
import com.ttbj.product.bean.dto.CoordDto;
import com.ttbj.product.bean.dto.Distance;
import com.ttbj.product.bean.dto.DriverDto;
import com.ttbj.product.bean.dto.EntitieDto;
import com.ttbj.product.bean.dto.PointDto;
import com.ttbj.util.Assert;

/**
 * 基于百度鹰眼技术的司机位置服务接口 .司机entity创建接口
 * 
 * @author Administrator
 *
 */
public interface LocationFacade {

	/**
	 * <h2>司机创建entity接口</h2> <i>百度鹰眼申请entity,自定义entity_name 暂时定位uuid </br>
	 * </i> <i>driver信息添加entity</br>
	 * </i> <i>返回entity_name</br>
	 * </i>
	 * 
	 * @return entity
	 * @throws Exception
	 */
	String entityAdd(String name, String desc, String city, String district) throws Exception;

	/**
	 * 根据坐标查询附近entity类
	 * 
	 * @param lng
	 * @param lat
	 * @throws Exception
	 */
	List<EntitieDto> aroundSearch(String lng, String lat) throws Exception;

	/**
	 * 查找entity最近的坐标
	 * 
	 * @param entity_name
	 * @throws Exception
	 */
	CoordDto getlatestpoint(String entity_name) throws Exception;

	/**
	 * 计算距离(使用腾讯api)
	 * 
	 * @param from
	 * @param to
	 * @throws Exception
	 */
	Distance getDistance(CoordDto from, CoordDto to) throws Exception;

	/**
	 * 轨迹查询(包含其他元素轨迹)
	 * 
	 * @param entity_name
	 * @param startDate
	 * @throws Exception
	 */
	List<PointDto> getTrack(String entity_name, String startDate) throws Exception;

	/**
	 * 坐标轨迹查询(只包含坐标轨迹)
	 * 
	 * @param entity_name
	 * @param startDate
	 * @throws Exception
	 */
	default List<CoordDto> getTrackCoord(String entity_name, String startDate) throws Exception {
		List<PointDto> points = getTrack(entity_name, startDate);
		if (null == points || points.isEmpty()) {
			return null;
		}
		List<CoordDto> list = new ArrayList<CoordDto>();
		for (PointDto pointDto : points) {
			Double longitude = pointDto.getLongitude();
			Double latitude = pointDto.getLatitude();
			if (null != longitude || null != latitude) {
				list.add(new CoordDto(String.valueOf(longitude), String.valueOf(latitude)));
			}
		}
		return list;
	}

	default List<EntitieDto> getEntites(String lng, String lat, Integer num) throws Exception {
		// 车辆查询
		// 查出坐标周围的司机
		List<EntitieDto> entitys = aroundSearch(lng, lat);
		if (Assert.isEmpty(entitys) || num > entitys.size()) {
			// 如果没有查询到司机那么就以公司坐标为准再查
			List<EntitieDto> entites_company = aroundSearch(CompanyLoaction.LNG, CompanyLoaction.LAT);
			entitys.addAll(entites_company);// 坐标合并
		}
		// 过滤出不符合条件的实体
		return entitys;
	}

	/**
	 * 根据坐标只查询附近的entity_name
	 * 
	 * @param lng
	 * @param lat
	 * @return
	 * @throws Exception
	 */
	default List<String> entitySearch(String lng, String lat) throws Exception {
		List<EntitieDto> aroundSearch = aroundSearch(lng, lat);
		List<String> entityArray = new ArrayList<String>();
		for (EntitieDto entitieDto : aroundSearch) {
			String entity_name = entitieDto.getEntity_name();
			if (!StringUtils.isEmpty(entity_name)) {
				entityArray.add(entity_name);
			}
		}
		return entityArray;
	}

	List<Map<String, List<PointDto>>> allTrack(List<String> entitys, String startDate) throws Exception;

}
